package com.bitoon.basketdudes.web.jpa;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.*;
import java.util.Iterator;

@Entity
@Table(name = "network", schema="rankings")
@NamedQueries({
    /*
    @NamedQuery(name = "Network.findById", query = "SELECT n FROM Network n WHERE n.id = :id"),
    @NamedQuery(name = "Network.findAll", query = "SELECT n FROM Network n"),
    @NamedQuery(name = "Network.findByFirstLetters", query = "SELECT n FROM Network n WHERE LOWER(n.nombre) >= :letraDesde and LOWER(n.nombre) < :letraHasta ORDER BY n.nombre"),
     *
     */
    @NamedQuery(name = "Network.findByNombre", query = "SELECT n FROM Network n WHERE LOWER(n.nombre) = :nombre"),
    @NamedQuery(name = "Network.findByNombreUrl", query = "SELECT n FROM Network n WHERE LOWER(n.nombreUrl) = :nombre"),
    /*    
    @NamedQuery(name = "Network.findByNombre", query = "SELECT n FROM Network n WHERE n.nombre = :nombre"),
    @NamedQuery(name = "Network.findByTotal", query = "SELECT n FROM Network n WHERE n.total = :total"),
     */
    @NamedQuery(name = "Network.findByUsuarioId", query = "SELECT n FROM Network n WHERE n.usuario.id = :idUsuario order by n.nombre")
    /*
    @NamedQuery(name = "Network.findByFAlta", query = "SELECT n FROM Network n WHERE n.fAlta = :fAlta")
     * 
     */
})
@NamedNativeQuery(name = "Network.posicionMedia", query= "select avg(posicion) from rankings.ranking_network where network_id = ?", resultClass=Network.class)
public class Network implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @SequenceGenerator(name="network_id_generator", sequenceName="rankings.network_id_seq", allocationSize=1)
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="network_id_generator")
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;
    @Basic(optional = false)
    @Column(name = "nombre")
    private String nombre;
    @Basic(optional = false)
    @Column(name = "nombre_url")
    private String nombreUrl;
    @Basic(optional = false)
    @Column(name = "total")
    private int total;

    /*
    @Basic(optional = false)
    @Column(name = "creador")
    private int creador;
    */

    @ManyToOne
    @JoinColumn(name="creador")
    private Usuario usuario;

    @Basic(optional = false)
    @Column(name = "f_alta")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fAlta;

    //@Fetch(FetchMode.SUBSELECT)
    @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "network", orphanRemoval=true)
    //@IndexColumn(name="network_id")
    private List<RankingNetwork> rankingList;

    // A ver ...
    //@Fetch(FetchMode.SUBSELECT)
    @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "network", orphanRemoval=true)
    private List<EquipoNetwork> equipoList;

    /*
    @OneToMany(cascade=CascadeType.ALL)
    @JoinTable(name="EquipoNetwork",
        joinColumns = {@JoinColumn(name="network_id",unique=false)},
        inverseJoinColumns= {@JoinColumn(name="equipo_id")})
    private List<EquipoNetwork> equipos;
     * 
     */


    /*
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "network")
    private List<EquipoNetwork> equipoNetworkList;
     * 
     */

    /*
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "network")
    private List<RankingNetwork> rankingNetworkList;
     * 
     */

    @Basic(optional = true)
    //@Column(name="posicion_media", insertable=false, updatable=false)
    @Transient
    private int posicionMedia;

    public Network() {
        this.fAlta = new Date();
    }

    public Network(Integer id) {
        this.id = id;
    }

    public Network(Integer id, String nombre, int total, int creador, Date fAlta) {
        this.id = id;
        this.nombre = nombre;
        this.total = total;
        //this.creador = creador;
        this.fAlta = fAlta;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public int getTotal() {
        return total;
    }

    public void setTotal(int total) {
        this.total = total;
    }

    /*
    public int getCreador() {
        return creador;
    }

    public void setCreador(int creador) {
        this.creador = creador;
    }
     *
     */

    public Date getFAlta() {
        return fAlta;
    }

    public void setFAlta(Date fAlta) {
        this.fAlta = fAlta;
    }

    /*
    public List<EquipoNetwork> getEquipoNetworkList() {
        return equipoNetworkList;
    }

    public void setEquipoNetworkList(List<EquipoNetwork> equipoNetworkList) {
        this.equipoNetworkList = equipoNetworkList;
    }
     * 
     */

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Network)) {
            return false;
        }
        Network other = (Network) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "com.bitoon.basketdudes.web.jpa.Network[id=" + id + "]";
    }

    public int getPosicionMedia() {
        int media = 0;int i =0;

        for(EquipoNetwork obj : equipoList) {
            //si el equipo no tiene ranking lo comprobamos
            if (obj.getEquipo().getRanking()!=null) {
                media = media + obj.getEquipo().getRanking().getPosicion();
            }
            ++i;
        }

        //si hay equipos sin ranking la media puede ser 0. algo(se muestra -)
        if (media>0) {
            posicionMedia = (media/i);
        } else {
            posicionMedia = 0;
        }

        return posicionMedia;
    }

    public void setPosicionMedia(int posicionMedia) {
        this.posicionMedia = posicionMedia;
    }

    public String getNombreUrl() {
        return nombreUrl;
    }

    public void setNombreUrl(String nombreUrl) {
        this.nombreUrl = nombreUrl;
    }

    public List<RankingNetwork> getRankingList() {
        return rankingList;
    }

    public void setRankingList(List<RankingNetwork> rankingList) {
        this.rankingList = rankingList;
    }

    public List<EquipoNetwork> getEquipoList() {
        return equipoList;
    }

    public void setEquipoList(List<EquipoNetwork> equipoList) {
        this.equipoList = equipoList;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    /*
    public List<RankingNetwork> getRankingNetworkList() {
        return rankingNetworkList;
    }

    public void setRankingNetworkList(List<RankingNetwork> rankingNetworkList) {
        this.rankingNetworkList = rankingNetworkList;
    }
     * 
     */

}
